# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import json
import urllib.request

# 如果想使用管道的话，那么就必须在 settings 中开启管道
class ScrapyDangdang04Pipeline:
    # 在爬虫文件开始之前就执行的方法
    def open_spider(self, spider):
        self.fp = open('book.json', 'w', encoding="utf-8")

    # 在爬虫文件执行完之后，执行的方法
    def close_spider(self, spider):
        self.fp.close()

    # item 就是 yield 后面的 book 对象
    def process_item(self, item, spider):
        # 以下这种模式不推荐，因为每次传递过来一个对象，那么就打开一次文件，对文件的操作过于频繁

        # （1）write 方法必须要写一个字符串，而不是其他的对象
        # （2）w 模式 会每一个对象都打开一次文件，覆盖之前的内容
        # item_json = json.dumps(dict(item), ensure_ascii=False)
        #
        # with open('book.json', 'a', encoding="utf-8") as fp:
        #     fp.write(item_json)

        item_json = json.dumps(dict(item), ensure_ascii=False)
        self.fp.write(item_json)

        return item

# 多条管道开启
# （1）定义管道类
# （2）在 settings 中开启管道
# （3）在 pipelines 中指定优先级
# "scrapy_dangdang_04.pipelines.DangDangDownloadPipeline": 301
class DangDangDownloadPipeline:

    def process_item(self, item, spider):

        url = item.get("src")
        file_name = f"./books/{url.split('/')[-1]}"

        urllib.request.urlretrieve(url=url, filename=file_name)

        return item